home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 23
/
AACD 23.iso
/
AACD
/
Programming
/
tek
/
exec.h
< prev
next >
Wrap
C/C++ Source or Header
|
2001-05-13
|
7KB
|
202 lines
#ifndef _TEK_EXEC_H
#define _TEK_EXEC_H
/*
** tek/exec.h
** tasks, signals, msgports
*/
#include <tek/mem.h>
/*
** task structure
**
** consider it private and access it with the supplied accessor
** macros, so that your code won't break once this structure gets
** blackboxed.
*/
typedef struct /* task */
{
THNDL handle; /* object handle */
TAPTR basetask; /* base task (may be backptr to this task) */
TVOID (*func)(TAPTR); /* user entry function */
TBOOL (*initfunc)(TAPTR); /* user init function in child context */
TAPTR userdata; /* user/init data */
TKNOB thread; /* kernel thread object */
TKNOB timer; /* kernel timer object */
TMMU heapmmu; /* heap memory manager */
TAPTR heapallocator; /* heapmmu's underlying allocator */
TKNOB runlock; /* run-environment lock */
TKNOB statusevent; /* status change event */
TUINT status; /* task status */
TKNOB siglock; /* signal lock */
TKNOB sigevent; /* signal event */
TUINT sigstate; /* current signal state */
TUINT sigfree; /* free signals */
TUINT sigused; /* used signals */
TAPTR port; /* task's primaray async msgport */
TAPTR syncreplyport; /* task's internal msgport for synchronized replies */
TMMU *msgmmu; /* ptr to basetask message memory manager */
} TTASK;
/*
** task status
**
** applications never need to query these flags.
*/
#define TTASK_STATUS_INITIALIZING 0 /* task is initializing */
#define TTASK_STATUS_RUNNING 1 /* task is running */
#define TTASK_STATUS_FINISHED 2 /* task has concluded */
#define TTASK_STATUS_FAILED 3 /* task failed to initialize and was never running in tekspace */
typedef struct /* lock */
{
THNDL handle; /* object handle */
TKNOB lock; /* kernel lock object */
} TLOCK;
typedef struct /* message communication port */
{
THNDL handle; /* object handle */
TKNOB lock; /* kernel lock object */
TLIST msglist; /* list of queued messages */
TAPTR sigtask; /* task to be signalled on msg arrival */
TUINT signal; /* signal to appear in sigtask */
TAPTR proxy; /* proxy object for this port */
TAPTR reserved[2];
} TPORT;
/*
** task entry and init functions
*/
typedef TVOID (*TTASKFUNC)(TAPTR task);
typedef TBOOL (*TTASKINITFUNC)(TAPTR task);
/*
** task signals
**
** note: currently there are 31 free user signals, but the number of
** reserved signals (like TTASK_SIG_ABORT) may grow in the future.
** TEKlib guarantees that a newly created task's upper 16 signal bits
** (0x8000000 through 0x00010000) will remain available to the user.
** more free user signals (if available) can be obtained safely with
** TAllocSignal(). allocation is recommended anyway.
*/
#define TTASK_MAX_SIGNALS 32
#define TTASK_SIG_ABORT 0x00000001
#define TTASK_SIG_RESERVED TTASK_SIG_ABORT
#define TTASK_SIG_USER 0xffff0000
/*
** task tags
*/
#define TTASKTAGS_ (TTAG_USER + 0x300)
#define TTask_MMU (TTAG) (TTASKTAGS_ + 0) /* parent memory manager */
#define TTask_InitFunc (TTAG) (TTASKTAGS_ + 1) /* child init function */
#define TTask_UserData (TTAG) (TTASKTAGS_ + 2) /* ptr to user/init data */
#define TTask_HeapMMU (TTAG) (TTASKTAGS_ + 3) /* memory manager for task's heap space */
#define TTask_CreatePort (TTAG) (TTASKTAGS_ + 4) /* create a message port in task's context */
/*
** TFLOAT time support macros
*/
#define TTIMETOF(t) (((TFLOAT) (t)->sec) + 0.000001f * ((TFLOAT) (t)->usec))
#define TFTOTIME(f,t) (t)->sec = (TUINT) (f); (t)->usec = (TUINT) (((f) - (t)->sec) * 1000000);
#define TTimeDelayF(task,f) { TTIME t; TFTOTIME(f,&t); TTimeDelay(task, &t); }
/*
** support macros for memory allocation from a task's heap memory manager.
** memory allocated from the task's heap will be automatically freed when
** the task exits.
*/
#define TTaskAlloc(task,size) TMMUAlloc(&((TTASK *) (task))->heapmmu, size)
#define TTaskAlloc0(task,size) TMMUAlloc0(&((TTASK *) (task))->heapmmu, size)
#define TTaskFree(task,mem) TMMUFree(&((TTASK *) (task))->heapmmu, mem)
#define TTaskRealloc(task,mem,newsize) TMMURealloc(&((TTASK *) (task))->heapmmu, mem, newsize)
#define TTaskGetSize(task,mem) TMMUGetSize(&((TTASK *) (task))->heapmmu, mem)
#define TTaskAllocHandle(task,df,size) TMMUAllocHandle(&((TTASK *) (task))->heapmmu, (TDESTROYFUNC) df, size)
#define TTaskAllocHandle0(task,df,size) TMMUAllocHandle0(&((TTASK *) (task))->heapmmu, (TDESTROYFUNC) df, size)
/*
** task accessor macros
*/
#define TTaskGetData(task) ((TTASK *) (task))->userdata
#define TTaskSetData(task,data) { ((TTASK *) (task))->userdata = data; }
#define TTaskPort(task) ((TPORT *)(((TTASK *) (task))->port))
#define TTaskBaseTask(task) ((TTASK *) (task))->basetask
#define TTaskHeapMMU(task) &((TTASK *) (task))->heapmmu
#define TTaskMsgMMU(task) ((TTASK *) (task))->msgmmu
#define TTaskSyncPort(task) ((TPORT *)(((TTASK *) (task))->syncreplyport))
TBEGIN_C_API
extern TAPTR TCreateTask(TAPTR parenttask, TTASKFUNC function, TTAGITEM *tags) __ELATE_QCALL__(("qcall lib/tek/task/createtask"));
extern TAPTR TCreateTaskTags(TAPTR parenttask, TTASKFUNC function, TTAG tag1, ...) __ELATE_QCALL__(("qcall lib/tek/task/createtasktags"));
extern TUINT TAllocSignal(TAPTR task, TUINT signals) __ELATE_QCALL__(("qcall lib/tek/task/allocsignal"));
extern TVOID TFreeSignal(TAPTR task, TUINT signal) __ELATE_QCALL__(("qcall lib/tek/task/freesignal"));
extern TVOID TSignal(TAPTR task, TUINT signals) __ELATE_QCALL__(("qcall lib/tek/task/signal"));
extern TUINT TSetSignal(TAPTR task, TUINT newsignals, TUINT sigmask) __ELATE_QCALL__(("qcall lib/tek/task/setsignal"));
extern TUINT TWait(TAPTR task, TUINT sigmask) __ELATE_QCALL__(("qcall lib/tek/task/wait"));
extern TUINT TTimedWait(TAPTR task, TUINT sigmask, TTIME *timeout) __ELATE_QCALL__(("qcall lib/tek/task/timedwait"));
extern TBOOL TInitLock(TAPTR task, TLOCK *lock, TTAGITEM *tags) __ELATE_QCALL__(("qcall lib/tek/task/initlock"));
extern TVOID TLock(TLOCK *lock) __ELATE_QCALL__(("qcall lib/tek/task/lock"));
extern TVOID TUnlock(TLOCK *lock) __ELATE_QCALL__(("qcall lib/tek/task/unlock"));
extern TPORT *TCreatePort(TAPTR task, TTAGITEM *tags) __ELATE_QCALL__(("qcall lib/tek/task/createport"));
extern TPORT *TCreatePortTags(TAPTR task, TTAG tag1, ...) __ELATE_QCALL__(("qcall lib/tek/task/createporttags"));
extern TVOID TWaitPort(TPORT *port) __ELATE_QCALL__(("qcall lib/tek/task/waitport"));
extern TVOID TTimeDelay(TAPTR task, TTIME *time) __ELATE_QCALL__(("qcall lib/tek/task/timedelay"));
extern TVOID TTimeQuery(TAPTR task, TTIME *time) __ELATE_QCALL__(("qcall lib/tek/task/timequery"));
extern TVOID TTimeReset(TAPTR task) __ELATE_QCALL__(("qcall lib/tek/task/timereset"));
extern TINT TGetRandomSeed(TAPTR task) __ELATE_QCALL__(("qcall lib/tek/task/getrandomseed"));
/*
** private functions.
*/
extern TINT TDestroyPort(TAPTR msgport) __ELATE_QCALL__(("qcall lib/tek/task/destroyport"));
extern TAPTR TTaskFindSelf(TVOID) __ELATE_QCALL__(("qcall lib/tek/task/taskfindself"));
TEND_C_API
#endif